package com.oyjd;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.UUID;

/**
 * 文件操作工具
 * 
 * @author 欧建东
 * @email oyjd@163.com
 * 
 */
public class FileOP {

	/**
	 * 读取文件
	 * 
	 * @param path
	 *            路径
	 * @param encoding
	 *            文件编码
	 * @return
	 */
	public static byte[] readFile(InputStream fis) {
		try {
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			byte[] b = new byte[1024];
			int pos = -1;
			while (-1 != (pos = fis.read(b))) {
				baos.write(b, 0, pos);
			}
			byte[] all = baos.toByteArray();
			fis.close();
			baos.close();
			return all;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 读取文件
	 * 
	 * @param path
	 *            路径
	 * @param encoding
	 *            文件编码
	 * @return
	 */
	public static byte[] readFile(String path) {
		try {
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			InputStream fis = new FileInputStream(new File(path));
			byte[] b = new byte[1024];
			int pos = -1;
			while (-1 != (pos = fis.read(b))) {
				baos.write(b, 0, pos);
			}
			byte[] all = baos.toByteArray();
			fis.close();
			baos.close();
			return all;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 读取文件
	 * 
	 * @param path
	 *            路径
	 * @param encoding
	 *            文件编码
	 * @return
	 */
	public static String readFile(String path, String encoding) {
		try {
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			FileInputStream fis = new FileInputStream(new File(path));
			byte[] b = new byte[1024];
			int pos = -1;
			while (-1 != (pos = fis.read(b))) {
				baos.write(b, 0, pos);
			}
			byte[] all = baos.toByteArray();
			fis.close();
			baos.close();
			return new String(all, encoding);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 写入文件
	 * 
	 * @param path
	 *            路径
	 * @param content
	 *            文件字符内容
	 * @param encoding
	 *            文件编码
	 */
	public static void writeFile(String path, String content, String encoding, boolean flag) {
		try {
			File f = new File(path);
			f.getParentFile().mkdirs();
			byte[] all = content.getBytes(encoding);
			FileOutputStream fos = new FileOutputStream(f, flag);
			fos.write(all);
			fos.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 写入文件
	 * 
	 * @param path
	 *            路径
	 * @param content
	 *            文件字符内容
	 * @param encoding
	 *            文件编码
	 */
	public static void writeFile(String path, String content, String encoding) {
		writeFile(path, content, encoding, false);
	}

	/**
	 * 写入文件
	 * 
	 * @param path
	 *            路径
	 * @param content
	 *            文件字符内容
	 * @param encoding
	 *            文件编码
	 */
	public static void writeFile(String path, byte[] b) {
		try {
			File f = new File(path);
			f.getParentFile().mkdirs();
			FileOutputStream fos = new FileOutputStream(f);
			fos.write(b);
			fos.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 写入文件
	 * 
	 * @param path
	 *            路径
	 * @param file
	 *            文件
	 * @throws Exception
	 */
	public static void writeFile(String path, File file) throws Exception {
		File f = new File(path);
		f.getParentFile().mkdirs();
		FileOutputStream fos = new FileOutputStream(f);
		FileInputStream fis = new FileInputStream(file);
		byte[] b = new byte[10240];
		int pos = -1;
		while (-1 != (pos = fis.read(b))) {
			fos.write(b, 0, pos);
		}
		fos.flush();
		fos.close();
		fis.close();
	}

	/**
	 * 根据旧文件名生成一个新文件名
	 * 
	 * @param fileName
	 *            文件名
	 * @return
	 */
	public static String getNewUUIDName(String fileName) {
		if (null != fileName && !"".equals(fileName)) {
			return getUUID() + "." + getExName(fileName);
		} else {
			return "";
		}
	}

	/**
	 * 根据旧文件名生成一个新文件名
	 * 
	 * @param fileName
	 *            文件名
	 * @return
	 */
	public static String getNewHashName(String fileName, String pre) {
		if (null != fileName && !"".equals(fileName)) {
			int code = fileName.hashCode();
			return pre + code + "." + getExName(fileName);
		} else {
			return "";
		}
	}

	/**
	 * 获取扩展名 小写
	 * 
	 * @param fileName
	 *            文件名
	 * @return
	 */
	public static String getExName(String fileName) {
		String s = "";
		int p = fileName.lastIndexOf(".");
		if (-1 != p) {
			s = fileName.substring(p + 1).toLowerCase();
			if (s.length() > 3) {
				s = s.substring(s.length() - 3);
			}
		}
		return s;
	}

	/**
	 * 获取一个UUID
	 * 
	 * @return
	 */
	public static String getUUID() {
		return UUID.randomUUID().toString().replaceAll("-", "");
	}
}
